package com.lewis.util;

import java.io.UnsupportedEncodingException;
import java.util.Date;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;

/**
 * JWT 工具，生成签名后的token,使用开源包JJWT	
 *  一个JWT实际上就是一个字符串，它由三部分组成，头部（Header）、载荷（Payload）与签名（Signature）。
 * 拼接形式为：  Header.Payload.Signature
	 *    {  
		  "iss": "why",   
		  "iat": 1416797419,  
		  "exp": 1448333419,   
		  "aud": "www.example.com",  
		  "sub": "taobao.com",  
	  
	 	}
iss: 该JWT的签发者，是否使用是可选的；
sub: 该JWT所面向的用户，是否使用是可选的；
aud: 接收该JWT的一方，是否使用是可选的；
exp(expires): 什么时候过期，这里是一个Unix时间戳，是否使用是可选的；
iat(issued at): 在什么时候签发的(UNIX时间)，是否使用是可选的；
 * @author jiaqi.liu
 *
 */
public class TokenUtil {
	
	//加密的秘钥
	private final static String APP_KEY="FSDFDSFG";
	
	
	/**创建JWT*/
    public static String createJwt() throws IllegalArgumentException, UnsupportedEncodingException{
    	
        Algorithm al = Algorithm.HMAC256(APP_KEY);
        String token = JWT.create()
                .withIssuer("签发者")
                .withSubject("用户")
                .withClaim("userid", "1234")
                .withExpiresAt(new Date(System.currentTimeMillis()+360000))
           
                .sign(al);
        return token;
        
    }
    /**验证jwt*/
    public static void verifyJwt(String token) {
            try {
            	//算法
                Algorithm algorithm = Algorithm.HMAC256(APP_KEY);
                //解锁器
                JWTVerifier verifier = JWT.require(algorithm)
                    .build(); 
                //解锁
                DecodedJWT jwt = verifier.verify(token);
           
                System.out.println("解密密后得到的算法:"+jwt.getAlgorithm());
                System.out.println("解密密后得到subject:"+jwt.getSubject());
                System.out.println("解密密后得到过期时间:"+jwt.getExpiresAt());
                System.out.println(jwt.getClaim("userid").asString());
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }catch(TokenExpiredException e){
            	 System.out.println("token已过期");
            } catch (JWTVerificationException e) {
                e.printStackTrace();
                System.out.println("校验失败");
            }
    }

	public static void main(String[] args) throws IllegalArgumentException, UnsupportedEncodingException{
		
		 String token=createJwt();
		 System.out.println("加密后得到的jwt:"+token);
		 
		 verifyJwt("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiLnlKjmiLciLCJpc3MiOiLnrb7lj5HogIUiLCJleHAiOjE1Mjg0NDQ2NzIsInVzZXJpZCI6IjEyMzQifQ.NzUw6SJVWDzcCkxKiiSPTmEMyS1nZS9t4ybMVqH88xQ");
	}
	
}
